package com.module2;

import java.util.Scanner;

public class Q2_Wuziqi {

//  棋子坐标数组chess
    String[][] chess=new String[17][17];
//  报错标签erro
    static String erro="succes";
//  胜利标签win
    boolean win=false;



//  初始化棋盘的绘制
    public void InitPaint(){
            for(int i=0;i<17;i++){
                for(int j=0;j<17;j++){
                    //1，左上角空格
                    if(i==0 && j==0){
                        System.out.print("  ");
                    }else if(i==0 || j==0){
                        if(i>10){
                            //2，首行首列末端打印字母
                            System.out.print((char)(i+'a'-11)+" ");
                        }else if(j>10){
                            System.out.print((char)(j+'a'-11)+" ");
                            //3，首行首列前端打印数字
                        }else if(0==i && j<=10){
                            System.out.print((j-1)+" ");
                        }else if(0==j && i<=10){
                            System.out.print((i-1)+" ");
                        }
                    }else{
                        //4，其余打印+号
                        System.out.print("+ ");
                    }
                }
                System.out.println();
            }
    }



//  下棋落子后重新绘制棋盘的方法paint
    public String paint(String str,boolean person){
        char[] arr=str.toCharArray();
        int hang;
        int lie;
//      通过处理将键盘字母坐标和 chess 数组的数字坐标对应
        if(arr[0]>='a'){
            hang=arr[0]-'a'+11;
        }else{
            hang =Integer.parseInt(String.valueOf(arr[0]))+1;
        }
        if(arr[1]>='a'){
            lie=arr[1]-'a'+11;
        }else{
            lie =Integer.parseInt(String.valueOf(arr[1]))+1;
        }
//      落子位置异常判定
        if(hang<1 || hang>16 || lie<0 || lie>16){
            erro="该位置超出棋盘范围，请重新落子";
            System.out.println(erro);
            return erro;
        }else if(chess[hang][lie]!=null){
            erro="该处已经有棋子，请重新落子";
            System.out.println(erro);
            return erro;
        }else{
            erro="success";
        }
//      绘制新棋盘，大体类似InitPaint方法
        for(int i=0;i<17;i++){
            for(int j=0;j<17;j++){
            //1，打印白棋的位置并在chess数组中记录
           if(person==true && i==hang && j==lie) {
               chess[i][j] = "白";
               System.out.print(chess[i][j]+" ");
               //2，打印黑棋的位置并在chess数组中记录
           }else if(person==false && i==hang && j==lie) {
               chess[i][j] = "黑";
               System.out.print(chess[i][j]+" ");
               //3，打印之前的下棋落子信息
           }else if(chess[i][j]!=null && (i!=hang || j!=lie)){
               System.out.print(chess[i][j]+" ");
               //4，打印棋盘剩余
           }else{
               if(i==0 && j==0){
                   System.out.print("  ");
               }else if(i==0 || j==0){
                   if(i>10){
                       System.out.print((char)(i+'a'-11)+" ");
                   }else if(j>10){
                       System.out.print((char)(j+'a'-11)+" ");
                   }else if(0==i && j<=10){
                       System.out.print((j-1)+" ");
                   }else if(0==j && i<=10){
                       System.out.print((i-1)+" ");
                   }
               }else{
                   System.out.print("+ ");
               }
           }
            }
            System.out.println();
        }
        return erro;
    };


//  判断是否胜利的方法win
    public boolean win(String str){
        char[] arr=str.toCharArray();
        int hang;
        int lie;
//      通过处理将键盘字母坐标和 chess 数组的数字坐标对应
        if(arr[0]>='a'){
            hang=arr[0]-'a'+11;
        }else{
            hang =Integer.parseInt(String.valueOf(arr[0]))+1;
        }
        if(arr[1]>='a'){
            lie=arr[1]-'a'+11;
        }else{
            lie =Integer.parseInt(String.valueOf(arr[1]))+1;
        }
        int i=hang;
        int j=lie;
        String core=chess[hang][lie];
        int count=0;
//      判断同行胜利情况，找到第一颗同行同色连线棋子位置
        while(core==chess[i-1][j] ){
            i-=1;
        }
        for(int k=i;k<i+5;k++){
//          第一颗同行连线棋子i>12时，剩余棋子空间不足，不可能在同行胜利
            if(i>12)
                break;
//          从第一颗棋子计数，连接大于5颗胜利
            if(core==chess[k][j]){
                count++;
            }
            if(count==5){
                win=true;
            }
        }
        count=0;
        i=hang;
//      判断同列胜利情况，找到同列首颗同色连线棋子位置
        while(core==chess[i][j-1]){
            j-=1;
        }
        for(int k=j;k<j+5;k++){
//          第一颗同列连线棋子j>12时，剩余棋子空间不足，不可能在同列胜利
            if(j>12)
                break;
//          从第一颗棋子计数，连接大于5颗胜利
            if(core==chess[i][k]){
                count++;
            }
            if(count==5){
                win=true;
            }
        }
        count=0;
        j=lie;
//      判断左上至右下对角线胜利情况，找到首颗同色连线棋子位置
        while(core==chess[i-1][j-1]){
            i-=1;
            j-=1;
        }
        for(int k=i;k<i+5;k++){
            for(int l=j;l<j+5;l++){
//              第一颗连线棋子j>12或者i>12时，剩余棋子空间不足，不可能在此方向上胜利
                if(i>12 || j>12)
                    break;
//              从第一颗棋子计数，连接大于5颗胜利
                if(core==chess[k][l]){
                    count++;
                }
                if(count==5){
                    win=true;
                }
            }
        }
        count=0;
        i=hang;
        j=lie;

//      判断左下至右上对角线胜利情况，找到首颗同色连线棋子位置
        while(core==chess[i+1][j-1]){
            i+=1;
            j-=1;
        }
        for(int k=i;k>i-5;k--){
            for(int l=j;l<j+5;l++){
//              第一颗连线棋子j>12或者i<5时，剩余棋子空间不足，不可能在此方向上胜利
                if(i<5 || j>12)
                    break;
//              从第一颗棋子计数，连接大于5颗胜利
                if(core==chess[k][l]){
                    count++;
                }
                if(count==5){
                    win=true;
                }
            }
        }
        count=0;
        i=hang;
        j=lie;

        return win;
    }

    public static void main(String[] args) {
        System.out.println("五子棋规则：输入为 行坐标+列坐标形式。例：12 意义为第一行第二列，黑 为黑棋,白 为白棋");
        boolean person=false;
        boolean win=false;
        String str;
        Q2_Wuziqi a=new Q2_Wuziqi();
//      初始化棋盘
        a.InitPaint();
        while(win!=true){
            Scanner sc=new Scanner(System.in);
//          绘制黑棋落子后棋盘
            System.out.println("请黑棋落子:");
            str=sc.nextLine();
            erro=a.paint(str,person);
//          erro检验，失败一直提示直到成功
            while(erro!="success"){
                System.out.println("请黑棋落子:");
                str=sc.nextLine();
                erro=a.paint(str,person);
            }
//          判断落子位置是否能胜利
            win = a.win(str);
            if(win==true ){
                System.out.println("黑棋胜利!");
                break;
            }
//          转换下棋者
            person=!person;
//          绘制白棋落子后棋盘
            System.out.println("请白棋落子:");
            str=sc.nextLine();
            a.paint(str,person);
//          erro检验，失败一直提示直到成功
            while(erro!="success"){
                System.out.println("请白棋落子:");
                str=sc.nextLine();
                erro=a.paint(str,person);
            }
            win = a.win(str);
            if(win==true){
                System.out.println("白棋胜利!");
                break;
            }
            person=!person;
        }
    }
}
